/*
* 高阶函数 - 函数作为参数
* 模拟 forEach  filter  map  every  some  
* 高阶函数 - 函数作为返回值
* 模拟 once 函数
*/

// console.log('111') // 测试

// 函数作为参数：处理谁？array；如何处理? fn

function forEach(array, fn) { // 遍历
    for (let i = 0; i < array.length; i++) {
        fn(array[i])
    }
}
// 测试
// let list = [1,3,5,7]
// forEach(list,item=>{
//     console.log(item) // 1 3 5 7
// })

function filter(array, fn) { // 过滤
    let resultList = []
    // 方法一：
    // for(let i=0; i < array.length; i++){
    //     if(fn(array[i])){
    //         resultList.push(array[i])
    //     }
    // }
    // 方法二：
    forEach(array, item => {
        if (fn(item)) {
            resultList.push(item)
        }
    })
    return resultList
}
// 测试
// let list = [1,3,5,7]
// let list1=filter(list,item=>{
//     return item>4
// })
// console.log(list1) // [5,7]

function map(array, fn) { // 相同处理
    let resultList = []
    for (let i = 0; i < array.length; i++) {
        resultList.push(fn(array[i]))
    }
    return resultList
}
// 测试
// let list = [1,3,5,7]
// let list1=map(list,item=>{
//     return item * item
// })
// console.log(list1) // [1, 9, 25, 49]

function every(array, fn) { // 判断是不是每个都符合fn的要求
    let done = true
    for (let i = 0; i < array.length; i++) {
        if (!fn(array[i])) {
            done = false
            break
        }
    }
    return done
}
// 测试
// let list = [1,3,5,7]
// let isEvery=every(list,item=>{
//     return item>0
// })
// console.log(isEvery) // true

function some(array, fn) { // 判断是不是有一个都符合fn的要求
    let done = false
    for (let i = 0; i < array.length; i++) {
        if (fn(array[i])) {
            done = true
            break
        }
    }
    return done
}
// 测试
// let list = [1, 3, 5, 7]
// let isEvery = some(list, item => {
//     return item > 7
// })
// console.log(isEvery) // false

// 函数作为返回值:

function once(fn) {
    let done = false
    return function () {
        if(!done){
            done = true
            fn.apply(this,arguments)
        }
    }
}
// 测试
let pay = once(money=>{
    console.log(`支付:${money}RMB`)
})
pay(5)
pay(5)
pay(7)

// 闭包

